// 导入 CryptoJS 库
import CryptoJS from 'crypto-js';
import md5 from 'js-md5';
import {
	keyStr,
	ivStr,
	formatDuration
} from '@/common/config';

// 定义加密密钥和矢量
const DEFAULT_KEY = "hfhfuu8dolv98bt6"; // 16字节
const DEFAULT_IV = "yyuuide456789012"; // 16字节

// AES 加密函数
export function aes_encrypt(word) {
	const localKey = keyStr || DEFAULT_KEY;
	const localIv = ivStr || DEFAULT_IV;
	const key = CryptoJS.enc.Utf8.parse(localKey);
	const iv = CryptoJS.enc.Utf8.parse(localIv);
	const encrypted = CryptoJS.AES.encrypt(word, key, {
		iv: iv,
		mode: CryptoJS.mode.CBC,
		padding: CryptoJS.pad.Pkcs7
	});
	return encrypted.toString();
}
// 121 irNj8EWs4cf0v3NmQ0C76g==
// AES 解密函数
export function aes_decrypt(word) {
	try {
		if (!word) return;
		const localKey = keyStr || DEFAULT_KEY;
		const localIv = ivStr || DEFAULT_IV;
		const key = CryptoJS.enc.Utf8.parse(localKey);
		const iv = CryptoJS.enc.Utf8.parse(localIv);
		const restoreBase64 = word.replace(/[\r\n\s]/g, '');
		const decrypt = CryptoJS.AES.decrypt(restoreBase64, key, {
			iv: iv,
			mode: CryptoJS.mode.CBC,
			padding: CryptoJS.pad.Pkcs7
		});
		const result = decrypt.toString(CryptoJS.enc.Utf8);
		if (!result) {
			throw new Error("解密失败，返回空结果。请检查密钥/IV和密文是否正确。");
		}
		return result;
	} catch (error) {
		console.error("解密错误:", error);
		return null; // 或根据需求抛出异常
		//TODO handle the exception
	}
}


let key = '1234567890123456';
// AES解密
export function decrypt(encryptedData, keys = "") {
	try {
		encryptedData = encryptedData.replace(/\s/g, '');
		keys = CryptoJS.enc.Utf8.parse(md5(keys || key));
		const decrypt = CryptoJS.AES.decrypt(encryptedData, keys, {
			mode: CryptoJS.mode.ECB,
			padding: CryptoJS.pad.Pkcs7
		});
		return decrypt.toString(CryptoJS.enc.Utf8);
	} catch (error) {
		console.error('解密失败:', error);
		return null;
	}
}

// AES加密
export function encrypt(data, keys = "") {
	try {
		if (typeof data === 'object') {
			data = JSON.stringify(data);
		}
		keys = CryptoJS.enc.Utf8.parse(md5(keys || key));
		const encrypted = CryptoJS.AES.encrypt(data, keys, {
			mode: CryptoJS.mode.ECB,
			padding: CryptoJS.pad.Pkcs7
		});
		const result = CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
		return result;
	} catch (error) {
		console.error('加密失败:', error);
		return null;
	}
}

/**
 * 时长格式转换函数
 * @param {number} seconds 总秒数（必传，如 3661 秒）
 * @param {Object} options 配置项（可选）
 * @param {boolean} options.keepHours 是否强制保留小时位（默认 false：不足1小时则不显示小时）
 * @param {boolean} options.padZero 是否补零（默认 true：单数补0，如 1分2秒 → 01:02）
 * @param {string} options.separator 分隔符（默认 ':'，如需用 '-' 可自定义）
 * @returns {string} 格式化后的时长（如 "1:01:01"、"61:01"、"1:02" 等）
 */
export function format_duration(seconds, options = {}) {
	// 默认配置
	const {
		keepHours = false,
			padZero = true,
			separator = ':'
	} = options;

	// 处理异常值（若传入非数字或负数，返回"00:00"）
	if (isNaN(seconds) || seconds < 0) {
		return padZero ? `00${separator}00` : `0${separator}0`;
	}

	// 计算时、分、秒
	const hours = Math.floor(seconds / 3600);
	const minutes = Math.floor((seconds % 3600) / 60);
	const secs = Math.floor(seconds % 60);

	// 补零函数（根据配置，单数补0）
	const pad = (num) => padZero ? String(num).padStart(2, '0') : num;

	// 场景1：需要显示小时（强制保留小时位，或小时数>0）
	if (keepHours || hours > 0) {
		return `${pad(hours)}${separator}${pad(minutes)}${separator}${pad(secs)}`;
	}
	// 场景2：无需显示小时（仅分:秒）
	else {
		return `${pad(minutes)}${separator}${pad(secs)}`;
	}
}